<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>es5原型Object/Function继承关系</title>
  <!-- 
  在 JavaScript ES5 中， Object  和  Function  是所有对象和函数的基类。它们之间的继承关系是理解 JavaScript 面向对象编程的关键。
  1.  Object  的基本概念
  - Object 是 JavaScript 中的一个内置构造函数，用于创建对象。
  - 所有 JavaScript 对象都可以追溯到  Object ，即所有对象都是  Object  的实例。
  -  Object.prototype  提供了一些基本的方法，如  toString() ,  hasOwnProperty() , 和  isPrototypeOf() 。

  2.  Function  的基本概念
  - Function 是 JavaScript 中的一个特殊对象，用于创建函数。
  - 所有函数都是对象，因此它们也是  Object  的实例，即  Function  是  Object  的子类。
  -  Function.prototype  提供了一些方法，如  call() ,  apply() , 和  bind() 。

  3. 继承关系图解
  可以用以下图示来表示  Object  和  Function  之间的继承关系：
  +-------------------+
          |      Object       |  ← 所有对象的基类
          +-------------------+
                    ↑
                    |
          +-------------------+
          |      Function      |  ← 所有函数的基类
          +-------------------+
          |   call()          |
          |   apply()         |
          |   bind()          |
          +-------------------+
                    ↑
                    |
          +-------------------+
          |   User-defined     |  ← 用户自定义的函数
          +-------------------+
  4. 继承关系的解释
  - Object 是所有对象的基类，所有对象都可以通过  Object  访问其原型链上的方法。
  - Function 作为  Object  的子类，继承了  Object  的所有属性和方法。这意味着所有函数都具有对象的特性，可以拥有属性和方法。
  - 当你创建一个函数时，它实际上是一个对象，因此可以在函数上添加属性和方法。

  5. 示例代码
  以下是一个简单的示例，展示了  Object  和  Function  之间的关系：
  // 创建一个对象
  var obj = { name: "Alice" };
  console.log(obj.toString()); // 输出: [object Object]

  // 创建一个函数
  function greet() {
      console.log("Hello!");
  }

  // 函数也是对象
  greet.customProperty = "This is a custom property";
  console.log(greet.customProperty); // 输出: This is a custom property

  // 使用 Function 的方法
  greet.call(obj); // 输出: Hello! (这里的 this 指向 obj)
  6. 总结
  在 ES5 中， Object  和  Function  之间的继承关系是 JavaScript 面向对象编程的核心。通过理解  Object  是所有对象的基类，而  Function  是  Object  的子类，开发者可以更好地理解 JavaScript 的对象模型和函数特性。这种继承关系使得 JavaScript 可以灵活地处理对象和函数，提供了强大的功能。
  -->
</head>

<body>

  <script>
    // 创建一个对象
    var obj = { name: "Alice" };
    console.log(obj.toString()); // 输出: [object Object]

    // 创建一个函数
    function greet() {
      console.log("Hello!");
    }

    // 函数也是对象
    greet.customProperty = "This is a custom property";
    console.log(greet.customProperty); // 输出: This is a custom property

    // 使用 Function 的方法
    greet.call(obj); // 输出: Hello! (这里的 this 指向 obj)

  </script>

</body>

</html>